# Copyright (c) 2021-2025 Intel Corporation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# DISCLAIMER: Bazel support is community-based. The maintainers do not
# use Bazel internally. The Bazel build can have security risks or
# optimization gaps.

load("@rules_cc//cc:defs.bzl", "cc_library", "cc_test")
load("@rules_license//rules:license.bzl", "license")

package(
    default_applicable_licenses = [":license"],
)

exports_files([
    "LICENSE",
])

license(
    name = "license",
    license_kinds = ["@rules_license//licenses/spdx:Apache-2.0"],
    license_text = "LICENSE.txt",
)

config_setting(
    name = "macos_x86_64",
    constraint_values = [
        "@platforms//os:osx",
        "@platforms//cpu:x86_64",
    ],
)

config_setting(
    name = "macos_arm64",
    constraint_values = [
        "@platforms//os:osx",
        "@platforms//cpu:arm64",
    ],
)

cc_library(
    name = "tbb",
    srcs = [
        "src/tbb/address_waiter.cpp",
        "src/tbb/allocator.cpp",
        "src/tbb/arena.cpp",
        "src/tbb/arena_slot.cpp",
        "src/tbb/concurrent_bounded_queue.cpp",
        "src/tbb/dynamic_link.cpp",
        "src/tbb/exception.cpp",
        "src/tbb/global_control.cpp",
        "src/tbb/governor.cpp",
        "src/tbb/itt_notify.cpp",
        "src/tbb/main.cpp",
        "src/tbb/market.cpp",
        "src/tbb/misc.cpp",
        "src/tbb/misc_ex.cpp",
        "src/tbb/observer_proxy.cpp",
        "src/tbb/parallel_pipeline.cpp",
        "src/tbb/private_server.cpp",
        "src/tbb/profiling.cpp",
        "src/tbb/queuing_rw_mutex.cpp",
        "src/tbb/rml_tbb.cpp",
        "src/tbb/rtm_mutex.cpp",
        "src/tbb/rtm_rw_mutex.cpp",
        "src/tbb/semaphore.cpp",
        "src/tbb/small_object_pool.cpp",
        "src/tbb/task.cpp",
        "src/tbb/task_dispatcher.cpp",
        "src/tbb/task_group_context.cpp",
        "src/tbb/tcm_adaptor.cpp",
        "src/tbb/thread_dispatcher.cpp",
        "src/tbb/thread_request_serializer.cpp",
        "src/tbb/threading_control.cpp",
        "src/tbb/version.cpp",
    ] + glob(["src/tbb/*.h"]),
    hdrs = glob([
        "include/tbb/*.h",
        "include/oneapi/*.h",
        "include/oneapi/tbb/*.h",
        "include/oneapi/tbb/detail/*.h",
    ]),
    copts = select({
        ":macos_x86_64": ["-mwaitpkg"],
        ":macos_arm64": [],
        "//conditions:default": [],
    }),
    defines = [
        "__TBB_DYNAMIC_LOAD_ENABLED=0",
        "__TBB_SOURCE_DIRECTLY_INCLUDED=1",
        "__TBB_SKIP_DEPENDENCY_SIGNATURE_VERIFICATION=1",
        "__TBB_BUILD",
        #"__TBB_USE_ITT_NOTIFY",
    ] + select({
        "@platforms//os:osx": ["_XOPEN_SOURCE"],
        "//conditions:default": [],
    }),
    includes = [
        "include",
    ],
    visibility = ["//visibility:public"],
)

cc_library(
    name = "tbbmalloc",
    srcs =
        glob([
            "src/tbbmalloc/*.h",
            "src/tbb/*.h",
            "src/tbbmalloc_proxy/*.h",
        ]) + [
            "src/tbbmalloc/backend.cpp",
            "src/tbbmalloc/backref.cpp",
            "src/tbbmalloc/frontend.cpp",
            "src/tbbmalloc/large_objects.cpp",
            "src/tbbmalloc/tbbmalloc.cpp",
        ],
    hdrs = glob([
        "include/tbb/*.h",
        "include/oneapi/tbb/detail/*.h",
        "include/oneapi/tbb/*.h",
    ]),
    includes = [
        "include",
    ],
    local_defines = [
        "__TBBMALLOC_BUILD",
    ],
    visibility = ["//visibility:public"],
)

cc_library(
    name = "tbbmalloc_proxy",
    srcs = [
        "src/tbbmalloc_proxy/function_replacement.cpp",
        "src/tbbmalloc_proxy/proxy.cpp",
    ],
    visibility = ["//visibility:public"],
    deps = [
        ":tbbmalloc",
    ],
)

cc_test(
    name = "test_mutex",
    srcs = [
        "test/tbb/test_mutex.cpp",
        "test/tbb/test_mutex.h",
    ] + glob([
        "test/common/*.h",
    ]),
    includes = ["test"],
    deps = [
        ":tbb",
    ],
)

cc_test(
    name = "test_blocked_range",
    srcs = [
        "test/tbb/test_blocked_range.cpp",
    ] + glob([
        "test/common/*.h",
    ]),
    includes = ["test"],
    deps = [
        ":tbb",
    ],
)

cc_test(
    name = "test_parallel_for",
    srcs = [
        "test/tbb/test_parallel_for.cpp",
        "test/tbb/test_partitioner.h",
    ] + glob([
        "test/common/*.h",
    ]),
    includes = ["test"],
    deps = [
        ":tbb",
    ],
)

cc_test(
    name = "test_parallel_reduce",
    srcs = [
        "test/tbb/test_parallel_reduce.cpp",
    ] + glob([
        "test/common/*.h",
    ]),
    includes = ["test"],
    deps = [
        ":tbb",
    ],
)

cc_test(
    name = "test_parallel_for_each",
    srcs = [
        "test/tbb/test_mutex.h",
        "test/tbb/test_parallel_for_each.cpp",
    ] + glob([
        "test/common/*.h",
    ]),
    includes = [
        "test",
        "test/tbb",
    ],
    deps = [
        ":tbb",
    ],
)

cc_test(
    name = "test_adaptive_mutex",
    srcs = [
        "test/conformance/conformance_mutex.h",
        "test/tbb/test_adaptive_mutex.cpp",
        "test/tbb/test_mutex.h",
    ] + glob([
        "test/common/*.h",
    ]),
    includes = [
        "test",
        "test/tbb",
    ],
    deps = [
        ":tbb",
    ],
)

cc_test(
    name = "test_task",
    srcs = [
        "test/tbb/test_task.cpp",
    ] + glob([
        "test/common/*.h",
    ]),
    includes = ["test"],
    deps = [
        ":tbb",
    ],
)

#cc_test(
#    name = "conformance_parallel_sort",
#    srcs = [
#        "test/conformance/conformance_parallel_sort.cpp",
#    ] + glob([
#        "test/common/*.h",
#    ]),
#    includes = ["test"],
#    deps = [
#        ":tbb",
#    ],
#)

cc_test(
    name = "conformance_task_group",
    srcs = [
        "test/conformance/conformance_task_group.cpp",
    ] + glob([
        "test/common/*.h",
    ]),
    includes = ["test"],
    deps = [
        ":tbb",
    ],
)

alias(
    name = "onetbb",
    actual = ":tbb",
    visibility = ["//visibility:public"],
)
